# coding:utf-8
from django.db.models import Q
from rest_framework import viewsets
from MSB_ERP.utils.base_views import MultipleDestroyMixin, MultipleOpenMixin
from MSB_ERP.utils.pagination import GlobalPagination
from basic_info.models import WarehouseModel
from basic_info.serializer.warehouse_Serializer import WarehouseSerializer,WarehouseSearchSerializer
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
from rest_framework.decorators import action


class WarehousesViews(viewsets.ModelViewSet, MultipleDestroyMixin, MultipleOpenMixin):
    """
        create:
        仓库信息--新增

        仓库信息新增, status: 201(成功), return: 新增仓库信息信息

        destroy:
        仓库信息--删除

        仓库信息删除, status: 204(成功), return: None

        multiple_delete:
        仓库信息--批量删除,必传参数：ids=[1,2,3,4...]

        仓库信息批量删除, status: 204(成功), return: None

        multiple_open:
        仓库信息--批量启用或者禁用,必传(json)参数：ids=[1,2,3,4...](列表中可以只有一个)，is_open=1/0

        {
            "ids":[1,2],
            "is_open":"0"
        }
        is_open=1表示禁用，is_open=0表示启用，
        仓库信息批量启用或者禁用, status: 204(成功), return: None

        update:
        仓库信息--修改,

        仓库信息修改, status: 200(成功), return: 修改后的仓库信息信息

        partial_update:
        仓库信息--局部修改,可以传参任意属性的值，服务器会修改指定的属性值

        仓库信息局部修改, status: 200(成功), return: 修改后的仓库信息信息

        list:仓库的过滤查询
        list:
        仓库信息--获取分页列表，可选json参数:name(名称)，mobile(手机号码)，phone(联系电话)

        {
            "name":"长沙",
            "mobile":"186"
            "phone":xxx
        }
        仓库信息列表信息, status: 200(成功), return: 仓库信息信息列表

        retrieve:
        查询某一个仓库信息

        查询指定ID的仓库信息, status: 200(成功), return: 用户仓库信息
        """
    queryset = WarehouseModel.objects.all()
    serializer_class = WarehouseSerializer
    pagination_class = GlobalPagination

    def get_serializer_class(self):
        if self.action == 'find':
            return WarehouseSearchSerializer
        return WarehouseSerializer

    def get_queryset(self):
        if self.action == 'find':  # 可能需要过滤查询
            # 接收三个可能的参数(在json中)，name,remark
            name = self.request.data.get('name', None)
            remark = self.request.data.get('remark', None)

            # 因为参数可能没有，造成过滤条件是动态的
            query = Q()
            if name:
                # 模糊查询,name like "%keyword%"
                query.add(Q(name__contains=name), 'AND')  # 多条件组合

            if remark:
                # 模糊查询,name like "%keyword%"
                query.add(Q(remark__contains=remark), 'AND')  # 多条件组合



            return WarehouseModel.objects.filter(query).all()
        else:

            return WarehouseModel.objects.all()

    json_params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        'name': openapi.Schema(type=openapi.TYPE_STRING, description="仓库名字的关键字"),
        'remark': openapi.Schema(type=openapi.TYPE_STRING, description="仓库描述的关键字"),


        # TYPE_ARRAY是列表，items列表里的元素是整数类型
    })  # TYPE_OBJECT传参是json格式,required参数名字,properties规定每个参数的具体类型

    # action装饰器可以接收两个参数：methods:该action对应的请求方式
    # detail:声明该action是否与单一资源对应，是否是xxx/<pk>/方法名
    # True表示路径是xxx/<pk>/方法名
    # False表示路径是xxx/方法名
    page_param = openapi.Parameter(name='page', in_=openapi.IN_QUERY, description='页号',
                                   type=openapi.TYPE_STRING)  # IN_QUERY在请求参数里
    size_param = openapi.Parameter(name='size', in_=openapi.IN_QUERY, description='每页显示的数量', type=openapi.TYPE_STRING)

    # 分页的页号和每页显示的数量只能通过请求路径传参
    @swagger_auto_schema(method='post', request_body=json_params,
                         manual_parameters=[page_param, size_param],
                         operation_description="仓库的过滤查询")  # 在接口注释,request_body传参,适用于接口文档，在文档中添加multiple_delete
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        return super(WarehousesViews, self).list(request=request, *args, **kwargs)
